﻿'Nombre:                         AdministracionVentana
'Descripcion:                    Ventana la cual permite la administracion de la tabla de movimientos
'Dependencias:                 
'Fecha de creación:              20090619
'Autor:                          VMORALES
'Fecha de modifcación:         
'Responsable:                  
'Num. de modifcación:            0

Option Explicit On
Option Strict On

#Region "Imports"

Imports Electrocucaracha.AdminPersonal.DAO
Imports System.Windows.Forms

#End Region

Namespace Movimiento

    ''' <summary>
    ''' Ventana la cual permite la administracion de la tabla de movimientos
    ''' </summary>
    Partial Public Class AdministracionVentana


#Region "Constantes"

#End Region

#Region "Miembros"

        Public Event MovimientoCambiado()
        Private _movimiento As Entidades.MovimientoDTO = Nothing
        Private _esEdicion As Boolean = False
        Private Shared _instancia As AdministracionVentana

#End Region

#Region "Propiedades"

        Public Property EsEdicion() As Boolean
            Get
                Return _esEdicion
            End Get
            Set(ByVal value As Boolean)
                _esEdicion = value
            End Set
        End Property

        Public Shared ReadOnly Property Instancia() As AdministracionVentana
            Get
                If _instancia Is Nothing Then
                    _instancia = New AdministracionVentana()
                End If
                Return _instancia
            End Get
        End Property

#End Region

#Region "Constructores"

        Private Sub New()

            ' This call is required by the Windows Form Designer.
            InitializeComponent()

            ' Add any initialization after the InitializeComponent() call.

        End Sub

#End Region

#Region "Funciones"

        ''' <summary>
        ''' Funcion que carga las cuentas relacionadas con el titular seleccionado, en caso de no tener alguno, carga todas las cuentas del sistema
        ''' </summary>
        Private Sub CargarCuentas()
            With Me.cmbCuentas
                If Titular.Manejador.Seleccion Is Nothing Then
                    .ItemsSource = Cuenta.Manejador.Cuentas
                Else
                    .ItemsSource = Cuenta.Manejador.Dao.Obtener(Titular.Manejador.Seleccion)
                End If

                .SelectedValuePath = "Id"
            End With
        End Sub

        ''' <summary>
        ''' Funcion que carga las categorias registradas en el sistema
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub CargarCategorias()
            With Me.cmbCategorias
                '.ItemsSource = Categoria.Manejador.obte
                .SelectedValuePath = "Id"
            End With
        End Sub

        ''' <summary>
        ''' Funcion que valida que dentro de los campos de texto se encuentren datos
        ''' </summary>
        ''' <returns>Verdadero en caso de que todos los campos sean validos, falso en caso contrario</returns>
        Private Function ValidacionCampos() As Boolean
            Dim resultado As Boolean = True

            If resultado And Me.cmbCuentas.SelectedValue Is Nothing Then
                MessageBox.Show("No se ha especificado una cuenta en especifico", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.cmbCuentas.Focus()
                resultado = False
            End If

            If resultado And Me.cmbCategorias.SelectedValue Is Nothing Then
                MessageBox.Show("No se ha especificado una categoria en especifico", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.cmbCategorias.Focus()
                resultado = False
            End If

            If resultado And String.IsNullOrEmpty(Me.txtDescripcion.Text) Then
                MessageBox.Show("No se ha especificado una descripcion en especifica", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.txtDescripcion.Focus()
                resultado = False
            End If

            If resultado And String.IsNullOrEmpty(Me.txtMonto.Text) Then
                MessageBox.Show("No se ha especificado un monto en especifico", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.txtMonto.Focus()
                resultado = False
            End If

            If resultado And Me.dtFecha.SelectedDate Is Nothing Then
                MessageBox.Show("No se ha especificado una fecha de creacion especifica", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.dtFecha.Focus()
                resultado = False
            End If

            ValidacionCampos = resultado
        End Function

        ''' <summary>
        ''' Funcion que crea un objeto de tipo movimiento a partir de los campos del formulario
        ''' </summary>
        ''' <returns>Objeto de tipo movimiento</returns>
        Private Function CrearObjeto() As Entidades.MovimientoDTO
            Dim movimiento As New Entidades.MovimientoDTO()

            With movimiento
                If Not _movimiento Is Nothing Then
                    .Id = Me._movimiento.Id
                End If
                .Cuenta = DirectCast(Me.cmbCuentas.SelectedItem, Entidades.CuentaDTO)
                .Categoria = DirectCast(Me.cmbCategorias.SelectedItem, Entidades.CategoriaDTO)
                .Descripcion = Me.txtDescripcion.Text.Trim()
                .Monto = CDec(Me.txtMonto.Text.Trim())
                .Fecha = Me.dtFecha.SelectedDate.Value
            End With

            CrearObjeto = movimiento
        End Function

        ''' <summary>
        ''' Funcion que resetea los campos de texto
        ''' </summary>
        Private Sub LimpiarTextos()
            Me.cmbCuentas.SelectedItem = Nothing
            Me.cmbCategorias.SelectedItem = Nothing
            Me.txtDescripcion.Text = String.Empty
            Me.txtMonto.Text = String.Empty
            Me.dtFecha.Text = String.Empty
        End Sub

        ''' <summary>
        ''' Funcion que habilita o deshabilita los controles de edicion del formulario
        ''' </summary>
        ''' <param name="_habilitar">Verdadero en caso de habilitar, falso en caso contrario</param>
        Private Sub HabilitarBotones(ByVal _habilitar As Boolean)
            Me.btnAplicar.IsEnabled = _habilitar
            Me.btnEliminar.IsEnabled = _habilitar
        End Sub

        ''' <summary>
        ''' Funcion que carga el movimiento seleccionado en la creacion de la ventana
        ''' </summary>
        Private Sub CargarObjeto()
            _movimiento = Movimiento.Manejador.Seleccion

            If Not _esEdicion Or _movimiento Is Nothing Then
                LimpiarTextos()
                SeleccionarCuenta()
                HabilitarBotones(False)
            Else
                With Me._movimiento
                    Me.cmbCuentas.SelectedValue = .Cuenta.Id
                    Me.cmbCategorias.SelectedValue = .Categoria.Id
                    Me.txtDescripcion.Text = .Descripcion.Trim()
                    Me.txtMonto.Text = .Monto.ToString("$ #,##0.00;($ #,##0.00);").Trim()
                    Me.dtFecha.SelectedDate = .Fecha
                End With
                HabilitarBotones(True)
            End If
        End Sub

        ''' <summary>
        ''' Funcion que carga la cuenta seleccionada en el combo
        ''' </summary>
        Private Sub SeleccionarCuenta()
            If Not Cuenta.Manejador.Seleccion Is Nothing Then
                Me.cmbCuentas.SelectedValue = Cuenta.Manejador.Seleccion.Id
            End If
        End Sub

        ''' <summary>
        ''' Funcion creada para controlar el cambio de seleccion de titular
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub SeleccionTitular()
            CargarCuentas()
            LimpiarTextos()
            HabilitarBotones(False)
        End Sub

#End Region

        Private Sub AdministracionVentana_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
            e.Cancel = True
            Me.Hide()
        End Sub

        Private Sub AdministracionVentana_IsVisibleChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.IsVisibleChanged
            If Me.IsVisible Then
                CargarObjeto()
            End If
        End Sub

        Private Sub AdministracionVentana_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            CargarCuentas()
            CargarCategorias()
            CargarObjeto()

            AddHandler Manejador.MovimientoCambiado, AddressOf CargarObjeto
            AddHandler Cuenta.Manejador.CuentasActivasCambiadas, AddressOf CargarCuentas
            'AddHandler Categoria.Manejador.CategoriasActivasCambiadas, AddressOf CargarCategorias
            AddHandler Cuenta.Manejador.CuentaCambiada, AddressOf SeleccionarCuenta
            AddHandler Titular.Manejador.TitularCambiado, AddressOf SeleccionTitular
        End Sub

        Private Sub btnAplicar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAplicar.Click
            If ValidacionCampos() Then
                Dim movimientoTemp As Entidades.MovimientoDTO = CrearObjeto()
                If Movimiento.Manejador.Dao.Actualizar(movimientoTemp) Then
                    LimpiarTextos()
                    RaiseEvent MovimientoCambiado()
                End If
            End If
        End Sub

        Private Sub btnEliminar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminar.Click
            If Not _movimiento Is Nothing Then
                Dim respuesta As DialogResult = MessageBox.Show(String.Format("¿Desea eliminar el movimiento {0} y toda su informacion asociada?", _movimiento.Descripcion), "Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                If respuesta = Forms.DialogResult.Yes AndAlso Movimiento.Manejador.Dao.Eliminar(_movimiento) Then
                    LimpiarTextos()
                    RaiseEvent MovimientoCambiado()
                End If
            End If
        End Sub

        Private Sub btnAgregar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAgregar.Click
            If ValidacionCampos() Then
                _movimiento = CrearObjeto()
                If Movimiento.Manejador.Dao.Agregar(_movimiento) Then
                    LimpiarTextos()
                    RaiseEvent MovimientoCambiado()
                End If
            End If
        End Sub

        Private Sub btnCerrar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCerrar.Click
            Me.Close()
        End Sub

        Private Sub btnCategorias_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCategorias.Click
            Dim w As Categoria.AdministracionVentana = Categoria.AdministracionVentana.Instancia

            With w
                AddHandler .CategoriaCambiada, AddressOf CargarCategorias

                .Show()
                .Focus()
            End With
        End Sub
    End Class

End Namespace
